接下來筆者會介紹coding interview中基本上會出現的流程~ (X)
以及因應這些流程應該做的事情~ (X)
別人的文章打的完整又詳細了,所以我只會補充他們沒講到的 (O)
(HR看到這篇覺得有什麼東西不希望被分享的話請寄到gmail信箱sendmefkingspammail)
在(大致上都是)45分鐘的面試中,面試官就是電就是光就是唯一的神話
從見面開始就千萬不要做任何一丁點可能會惹毛面試官的事情,
像是問面試官一些不禮貌的問題或是靠北一些什麼東西或是挖苦什麼東西的
還有溝通中像是一直沈默沒什麼反應,一直搶面試官話之類的
還有就算面試官說錯一些東西,
也沒有必要和他爭論,(誰知道面試完查一查資料到底是誰對?)
總之因為面試官完完全全掌握你的生殺大權,
像是在你遇到困難的時候到底要給你多少提示,
要不要對你超級嚴格或是一直保持微笑,
要多認真的讀懂你的code,檢查你的code之類的
就算是code寫得再快再電,
難免在其他地方有毛病可挑
最後review也是他打,他覺得你溝通不好就是不好,
code不好懂就是不好懂,讓他滿意就是讓Hiring Committee滿意,
不要和offer過不去
首先,有一個特別要注意的是小情境是:
如果面試是Phone interview的話,
interviewer有可能會用email裡留的視訊會議連結跟你聯絡,
但既然都叫做Phone interview了,
面試官也是有可能直接打到你當初留的手機跟你面試的!!
因為筆者當初第一次面Google的Phone interview是正常視訊面試,
隔年第二次面試Google的時候就一直在Google Meet裡面等,
等了快10分鐘想說怎麼面試官no show了,
直到發現面試官發email給我,
才發現原來面試官已經打到我靜音模式的手機兩通了,
雖然後來面試官進來Google Meet之後很友善的說,
因為剛剛delay了10分鐘,所以等等面試結束的時間會延後10分鐘,
不過要是今天遇到一個code還沒寫完又被delay10分鐘的面試官,
可能他一開始的時候的面試心情就會不太好,直接違反Rule No. 1,
千萬不要像筆者一樣犯這麼蠢的錯誤XDDD
留了電話就要開聲音!
這個超級重要
尤其常常緊張到前一天晚上睡不好的話
沒有活躍的腦袋先輸一半
任何一場coding interview應該都是從面試官簡單寒暄說個Hi他是誰之後就開始了
有10%會直接進入coding部分
但是90%應該都會從請candidate自我介紹開始
自我介紹的部分很重要的一點是:一定要中英都準備好一個簡短的約30秒至1分鐘可以講完的版本 (講完要講講完了XD)
千萬不要覺得(coding interview時),面試官叫你自我介紹是對你很有興趣,或是洋洋灑灑把自己大學工作上所有厲害的故事或是榮譽事蹟通通講一遍讓他印象深刻會對coding面試有任何加分
面試官就只想花這45分鐘好好了解你的寫code和DSA實力還有溝通是否合格,是不是好合作的同事,不會管學歷經歷什麼的
而且很多面試官很可能接下來還有其他meeting或是急事.時間一到(會先提醒你時間快到就是了)講兩三句話就掰掰了,如果出的題目是困難可能會寫不完的,反而是在浪費後面思考跟寫code的時間,就算面試題很簡單,也是在浪費想edge case跟double check and dry run跟問面試官問題的時間,非常不值得
但也不能太極端的自我介紹說個十秒就想打發面試官,這樣面試官可能一開始就覺得你態度很冷漠,是很難溝通很難合作的人,在這種地方被扣分很不值得(就算沒被扣分,記得rule no 1,面試官永遠是對的,自我介紹的時候就先有了一些負面印象絕對是大忌)
如果是Amazon(一小時的面試而且一半是BQ)或是一些有考專業領域知識的面試的話,筆者認為把過去工作/學校project經驗講清楚一點才是比較有好處的,因為對方會想要更了解你的背景和經歷,在問BQ或是專業領域知識的時候才比較好下手,筆者認為2~5分鐘都是合適的時間,(如果時間太長或太短面試官應該都會再跟你說)
大部分的面試就會在一個類似Google doc,基本上什麼debug功能都沒有的編輯平台上開始coding面試
像是那種大括號少打一個沒對稱也不會有醒目提醒,不會有換行的時候自動縮排的功能.也不能執行,通常只會有一些語言保留字上色功能甚至沒有,而且通常面試的時候也是不太能畫圖的,不是每個公司的視訊軟體都有即時的塗鴉白板功能,所以最好也要習慣平常就用文字的形式打一些樹或是圖的關係(用斜線反斜線箭頭等等)
然後面試官應該會跟你確認你要用的語言.沒有問題之後就會把面試題目貼過來
這個時候通常他會講一遍題目或是請你自己看看看不看得懂題目,
然後coding interview就開始了!!!
接下來這四篇是筆者覺得要去面試必讀的文章
我求各位去看了拜託,
每個都打得比我詳盡仔細,我會只補充這四篇文章裡面沒提到的事
(這樣我等等可以少打一點字)
從面試官角度來看程式面試:兩大能力與七個階段
[刷题之外]面试官角度看面试那点事(2)
面试中需要注意的细节-如何让你刷题的辛苦得到应有的回报
Google 面试技巧- 知乎
(還有一篇文章是筆者之前看PTT看到一篇介紹很最受用的什麼
在收到面試官的signal之前千萬不要開始寫code之類的某篇文
現在突然找不到連結,如果有讀者有看到可以留言跟我講)
筆者覺得最重要的就是在面試之前要知道,
面試官在面試的時候是非常忙的,不但要跟面試者互動
要看面試者的code有沒有錯,還要忙著打一堆note for review之類的
筆者也不確定確切的評分項目有哪些
但是感覺得出來一定至少會有的是DSA熟不熟.好不好溝通,表達能力,英文能力,卡住的話有沒有get到面試官的提示and反應速度,coding速度和正確性,code好不好讀懂,有沒有好好的確定跟檢查自己的code(dry run)自己就把自己的bug抓出來,想edge case和考慮到完善input case情況的能力等等這些項目
以Google來說,每面完一個人,
面試官回去還要再花一個小時左右的時間寫這個面試者的review
盡量能讓每個candidate都能有最完善且最詳細的review,
不但為了公平,這樣team match 或 Hiring Committee
最後在選人/決定Grade level的時候
才能綜合評比找到最適合跟最厲害的人
接下來的部分
可能會有點公式化
但如果文章的連結大家有仔細看完的話,就會知道這些公式化的項目有哪些,想要考察面試者的什麼東西
要是不照這套公式來,面試官也是很困擾,review很不好寫,所以就算感覺照這這套公式回答很八股很制式很白痴,
跟真的進公司寫code又不太一樣,但還是幫幫面試官的忙行行好貫徹rule no. 1 ..
就是像第一篇文章講的,大致上分為
1. 搞清楚題目
[[2.討論可能的解法 and 分析並總結所有解法
3. 寫程式
4. 主動檢查與測試 and 複雜度分析]] x N(視有沒有延伸題)
(打完收工,問面試官問題)
以下是筆者想要補充文章裡沒提到的:
a. 在這邊如果不管題目有沒有搞懂了,
記得一定要跟面試官要一個小case,
題目不懂可以拿來搞懂,
題目懂了也可以用這個小例子dry run觀察規律等等
(自己生case也可以)
b. 在確認input range的時候面試官通常只會回答int32塞得下,甚至會跟你說就是自然數之類的,所以那套用比賽用的input range猜需要的複雜度在這裡是行不通的,而且本來就不應該行得通,因為你的code running限制也不一定是1s,機器搞不好也是超級powerful那種,本來就應該慢慢跟面試官討論複雜度討論到他滿意覺得你可以開始寫(或是你先開始寫然後再來優化)
如果是純演算法的考題通常題目蠻明確的,但如果是比較接近leetcode Design tag的題目,可能還要再額外討論這個function會在什麼樣的情境下被call到,哪裡是bottleneck,應該要往哪個方向優化等等等等
然後在這邊記得要多打字或是(用文字)畫圖,不要一直空講話,這樣封包的送達率是很差的
在討論演算法而且面試官還算滿意的時候,建議可以打一些註解
尤其是如果有討論到一些(不管是面試官提供的還是自己想到的)例子或是TODO item
一定要在這時候用code打下來,因為非常有可能這邊討論了一些要做的東西,
但是等code打完的時候就忘記了,這個時候可能就會被扣分
收到可以開始寫code的signal才開始寫code
收到可以開始寫code的signal才開始寫code
收到可以開始寫code的signal才開始寫code
很重要講三遍
有可能是你演算法還沒完整,還有bug,(這個時候寫code is totally suicide)
也有可能是演算法複雜度離面試官期待的還很遠,時間還夠面試官覺得你應該試試看
有些時候就算題目早就會了,面試官還沒叫你開始寫可能是因為你還沒讓他聽懂你的演算法
記得寫程式的第一步是定義function的input output format,還有定義比如說TreeNode的內容
這不是leetcode contest, function return跟參數的type都沒有定義好,TreeNode也沒有定義好是left/right/value長怎樣,另外(以C++為例),面試官也可以順便檢查candidate是不是沒了別人的code參考,會連class TreeNode的大括弧最後都會忘記加分號之類的,通常面試官會favor有在打競賽的人
但是如果一看就知道這個人平常沒在寫C++ (為什麼 argument 要加const& 之類的都不知道)
那絕對是會被大扣分(尤其Google以外的公司)
接下來就是展現實力的時候了,
如果leetcode寫很熟的話,基本上coding很快又不太刪刪改改是很加分的
應該看得出來整個面試過程中有一大堆事情1. 2. 4.要做
遇到難題或進階題觀察規律想演算法就來不及了
寫code本身不應該要花太多時間,尤其是演算法如果是對的其實就不太會有bug
有沒有好好利用leetcode的題目練習到一次寫完就是bug free的目的就在這邊
如果好不容易演算法或是複雜度對了是面試官滿意的,但是寫code寫了20分鐘寫不完就太可惜了
(如果還有進階題,避免時間不夠
面試官通常會跳過簡單題的 “主動檢查與測試 and 複雜度分析”
直接再開始討論演算法跟寫程式的環節)
複雜度分析算是基本功,應該不太會有什麼問題
通常寫完code自己也都知道目前的複雜度是多少
建議也不要空講,直接用打的最簡單明瞭(尤其有時候n跟k的定義有點複雜的時候)
k: OOO
n: number of XXXX
TC: O(k*n^2)
MC: O(n)
比較容易因為剛好卡住或是遇到難題,
時間不夠而跳過的是做完題目的dry run和測試
盡量要記得是,沒時間做最後的檢查與測試的話,
也一定要補一句
“雖然我沒時間了,但是我在寫production code的時候我會想要測xxx跟ooo”
才不會讓面試官以為你忘記了,
review上面就寫說這個candidate完全沒想到要測自己的code之類的
—----
筆者想得到的補充大致上是這樣
(3:59am了 這篇10點開始打了5-6小時Orz)
不過照著這套八股的流程走還是會有一點點小犯錯的地方
之後在實際紀錄面試問題的文章中會再提到,敬請期待!
還有筆者亞麻的面試經驗跟這篇寫的不太一樣 也一樣會在之後分享!
(這系列文應該完全都是公開資訊,
HR有看完這篇覺得有任何不妥歡迎聯繫 sendmefkingspammail至gmail.com)
最近看到厲害的整理 先放在這邊:
Leetcode刷題學習筆記 – 解題技巧
Leetcode刷題學習筆記–心得統整
很重要的leetcode contest之外的事情:
FAANG 面試準備經驗與建議(一)
FAANG 面試準備經驗與建議(二)